<?php
/**
 * UserIdentity class
 */

/**
 * UserIdentity representa los datos necesarios para identificar a un usuario. 
 *
 * Contiene el método de autenticacion nque controla si los datos 
 * proveidos pueden identificar al usuario. 
 *
 * @package Components
 */
class UserIdentity extends CUserIdentity
{
	/**
	 * @var string representa el id del usuario
	 */
	private $_id;
	
	/**
	 * Autentica a un usuario. 
	 *
	 * @return boolean dependiendo del resultado de la autenticacion.
	 */
	public function authenticate()
	{		
		// buscar en la base de datos por un identificador primario (en este caso nombre)
		$record = Usuario::model()->findByAttributes(array('ci'=>$this->username));
		
		// si no se encientra el registro, mostrar un error
		if($record === null)
		{
			$this->errorCode = self::ERROR_USERNAME_INVALID;
			Yii::log('record null','warning','system');
		}
		// si la contraseña proveida no coincide con la contraseña, mostrar un error
		else if($record->password !== crypt($this->password,$record->password))
		{
			$this->errorCode = self::ERROR_PASSWORD_INVALID;
			Yii::log('password incorrecto. Input password: '.$this->password.' | expected password: '.$record->password.' | crypt password: '.crypt($this->password,$record->password),'warning','system');
		}
		else
		{
			// aca se pueden guardar cosas en la cookie, no guardar datos sensibles!
			$this->_id = $record->ci;
			$this->setState('ci',$record->ci);
			$this->setState('nombres',$record->nombres);
			$this->setState('apellidos',$record->apellidos);
			$this->setState('codigoAdministrativo',$record->codigo_adm);
			
			$id_alumno = Alumno::model()->findByAttributes(array('ci'=>$record->ci));
			if($id_alumno === null)
			{
				$this->setState('idAlumno',null);
			}
			else
			{
				$this->setState('idAlumno',$id_alumno->id_alumno);
			}
			$id_profesor = Profesor::model()->findByAttributes(array('ci'=>$record->ci));
			if($id_profesor === null)
			{
				$this->setState('idProfesor',null);
			}
			else
			{
				$this->setState('idProfesor',$id_profesor->id_profesor);
			}			
			
			$this->errorCode = self::ERROR_NONE;
		}
		
		// se devuelve si hubo o no errores
		return !$this->errorCode;
	}
	
	/**
	* Devuelve el id del usuario si esta autenticado
	*
	* @return integer ID del usuario autenticado
	*/
	public function getId()
	{
		return $this->_id;
	}
}